package com.manda.smart.hub.common.chain;

import java.util.Optional;

/**
 * 抽象责任链
 *
 * @author hongda.li
 */
public abstract class Chain<Context> {
    /**
     * 下一个待执行的责任链处理器
     */
    private Chain<Context> next;

    /**
     * 执行责任链
     *
     * @param context 上下文
     */
    public abstract void process(Context context);

    /**
     * 获取下一个责任链处理器
     *
     * @return 责任链处理器
     */
    protected Chain<Context> getNext() {
        return this.next;
    }

    /**
     * 设置下一个责任链处理器
     *
     * @param next 下一个责任链处理器
     */
    protected void setNext(Chain<Context> next) {
        this.next = next;
    }

    /**
     * 执行下一个责任链处理器
     * 若下一个责任链为空则跳过执行
     *
     * @param context 上下文
     */
    protected void doNext(Context context) {
        Optional.ofNullable(this.getNext()).ifPresent(nextChain -> nextChain.process(context));
    }
}
